package club.easin.log;

import club.easin.utils.IpUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Aspect
@Component
public class MyLogAspect {

    @Autowired
    HttpServletRequest request;

    //定义切点@Poincut
    //在注解位置切入代码
    @Pointcut("@annotation(club.easin.log.MyLog)")
    public void logPoinCut(){

    }

    //切面 配置通知
    @AfterReturning("logPoinCut()")
    public void saveSysLog(JoinPoint joinPoint){
        System.out.print("切面。。。。");
        LogDto logDto=new LogDto();

        //从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature=(MethodSignature)joinPoint.getSignature();
        //获取切入点所在的方法
        Method method=signature.getMethod();
        //获取操作
        MyLog myLog=method.getAnnotation(MyLog.class);
        if(myLog!=null){
            logDto.setOperation(myLog.value());
        }

        //获取请求类的类名
        String classNme=joinPoint.getTarget().getClass().getName();
        //获取请求方法名
        String methodName=method.getName();
        logDto.setMethod(classNme+"."+methodName);

        //获取请求参数
        Object[] args=joinPoint.getArgs();
        String parms= JSONObject.valueToString(args);
        logDto.setParams(parms);

        logDto.setCreateDate(new Date());

        //获取用户名
        logDto.setUsername("hello");

        //获取用户ip地址
        logDto.setIp(IpUtil.getIpAddr(request));

        System.out.println(logDto.toString());

    }

}
